package com.study.d012Components.listview;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

/** 鼠标放上去带放大效果的listview
*@description
*@author xtayhame
*date 2020年3月14日
*version
*since v1.0
*/
public class ListViewWithMagnify extends Application{
	public static void main(String[] args) {
		launch(args);
	}
	@Override
	public void start(Stage stage) throws Exception {
		ObservableList<String> datas=FXCollections.observableArrayList();
		datas.add("数据-A");
		datas.add("数据-B");
		datas.add("数据-C");
		datas.add("数据-D");
		datas.add("数据-E");

		ListView<String> listView = new ListView<String>(datas);
		listView.setPrefSize(250, 300);


		AnchorPane anchorPane = new AnchorPane();
		anchorPane.getChildren().add(listView);
		AnchorPane.setTopAnchor(listView, 20.0);
		AnchorPane.setLeftAnchor(listView, 20.0);

		stage.setScene(new Scene(anchorPane, 300, 400));
		stage.show();


		listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
			int position=0;  //索引

			@Override
			public ListCell<String> call(ListView<String> param) {
				Label label = new Label();
				//默认样式
				label.setPrefWidth(200);
				label.setFont(new Font(15));

				//这里的cell即listview中的每个元素
				//初始化的时候，根据元素个数会执行多次
				ListCell<String>  cell = new ListCell<String>(){
					//要实现updateItem()方法
					@Override
					protected void updateItem(String item, boolean empty) {
						super.updateItem(item, empty);
						if(!empty){
							//如果不为空
							label.setText(item);
							this.setGraphic(label);
							System.out.println("updateItem().............");
						}
					}
				};




				//鼠标滑动监听
				cell.hoverProperty().addListener(new ChangeListener<Boolean>() {
					@Override
					public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
							Boolean newValue) {
						System.out.println("鼠标是否划过：" + newValue);
						if(newValue && !"".equals(label.getText())){
							//如果鼠标划过，则字体放大
							position = param.getItems().indexOf(label.getText());
							System.out.println(position + " --" +label.getText());

							label.setPrefWidth(200);
							label.setFont(new Font(25));
							//加上样式
							param.getFocusModel().focus(position);

							//也可以给label或者cell添加背景颜色
							//label.setStyle("-fx-background-color:#ffff55");
							cell.setStyle("-fx-background-color:#ffff55");

						}else{
							//恢复原来的字体大小
							label.setPrefWidth(200);
							label.setFont(new Font(15));

							//label.setStyle("-fx-background-color:#ffff5500");

							cell.setStyle("-fx-background-color:#ffff5500");
						}

					}
				});

				System.out.println("返回cell.");
				return cell;
			}
		});


		//鼠标滚轮滑动事件
		listView.setOnScroll(new EventHandler<ScrollEvent>() {
			@Override
			public void handle(ScrollEvent event) {
				System.out.println(event.getDeltaY());
			}
		});

	}
}
